#ifndef __DEVICE_IOQUEUE_H
#define __DEVICE_IOQUEUE_H
#include "stdint.h"
#include "thread.h"
#include "sync.h"

#define bufsize 64

// 环形队列
struct ioqueue {
    struct lock lock;
    /*
     * 生产者，当缓冲区不满时，就往 buf 中插入数据
     * 否则就休眠(阻塞线程)，此项记录哪个生产者在此缓冲区上休眠
     **/
    struct task_struct* producer;

    /*
     * 消费者，当缓冲区不为空时，就读取 buf 中的数据
     * 否则就休眠，此项记录哪个消费者在此缓冲区上休眠
     **/
    struct task_struct* consumer;
    char buf[bufsize]; // 顺序存储结构的循环队列 缓冲区
    int32_t head; // 对头
    int32_t tail; // 队尾
};

void ioqueue_init(struct ioqueue* ioq);
bool ioq_full(struct ioqueue* ioq);
char ioq_getchar(struct ioqueue* ioq);
void ioq_putchar(struct ioqueue* ioq, char byte);
#endif
